Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


RNS/Interfaces/LocalInterface.py b6bfd1655cbcda3c3da5389f0ed2a7b9f7db959b (b6bfd165) Text, 20.71 KB

T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2016-2025 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.

Tff7b72from T7ee787RNST7ee787.T7ee787InterfacesT7ee787.T7ee787Interface Tff7b72import Te6edf3Interface
Tff7b72from T7ee787RNST7ee787.T7ee787InterfacesT7ee787.T7ee787BackboneInterface Tff7b72import Te6edf3BackboneInterface
Tff7b72import T7ee787socketserver
Tff7b72import T7ee787threading
Tff7b72import T7ee787socket
Tff7b72import T7ee787time
Tff7b72import T7ee787sys
Tff7b72import T7ee787os
Tff7b72import T7ee787RNS
Tff7b72from T7ee787threading Tff7b72import Te6edf3Lock

Tff7b72class T56d364HDLCTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3FLAG Tff7b72= T79c0ff0x7E
Te6edf3ESC Tff7b72= T79c0ff0x7D
Te6edf3ESC_MASK Tff7b72= T79c0ff0x20

Tf0883e@staticmethod
Tff7b72def Td2a8ffescapeTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8ffreplaceTb4b4b4(Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4]Tb4b4b4)Tb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4, Te6edf3HDLCTff7b72.Td2a8ffESCTff7b72^Te6edf3HDLCTff7b72.Td2a8ffESC_MASKTb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3data Tff7b72= Te6edf3dataTff7b72.Td2a8ffreplaceTb4b4b4(Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)Tb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4, Te6edf3HDLCTff7b72.Td2a8ffFLAGTff7b72^Te6edf3HDLCTff7b72.Td2a8ffESC_MASKTb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3data

Tff7b72class T56d364ThreadingTCPServerTb4b4b4(Te6edf3socketserverTff7b72.Td2a8ffThreadingMixInTb4b4b4, Te6edf3socketserverTff7b72.Td2a8ffTCPServerTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffserver_bindTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_windowsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSOL_SOCKETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSO_EXCLUSIVEADDRUSETb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSOL_SOCKETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSO_REUSEADDRTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffbindTb4b4b4(Tff7b72selfTff7b72.Td2a8ffserver_addressTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffserver_address Tff7b72= Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffgetsocknameTb4b4b4(Tb4b4b4)

Tff7b72class T56d364LocalClientInterfaceTb4b4b4(Te6edf3InterfaceTb4b4b4)Tb4b4b4:
Te6edf3RECONNECT_WAIT Tff7b72= T79c0ff8
Te6edf3AUTOCONFIGURE_MTU Tff7b72= Tff7b72True
Te6edf3CLIENT_SLEEP_PAUSE_TIMEOUT Tff7b72= T79c0ff12

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3target_port Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3connected_socketTff7b72=Tff7b72NoneTb4b4b4, Te6edf3socket_pathTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffepoll_backend Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= T79c0ff262144
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72if Te6edf3socket_path Tff7b72!= Tff7b72None Tff7b72and Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffuse_af_unixTb4b4b4: Tff7b72selfTff7b72.Td2a8ffsocket_path Tff7b72= Ta5d6fffTa5d6ff"Tffea00\0Ta5d6ffrns/Tffd700{Te6edf3socket_pathTffd700}Ta5d6ff"
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffsocket_path Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffIN Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffOUT Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffreconnecting Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffnever_connected Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffdetached Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Te6edf3name
Tff7b72selfTff7b72.Td2a8ffmode Tff7b72= Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_FULL
Tff7b72selfTff7b72.Td2a8ffframe_buffer Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72selfTff7b72.Td2a8fftransmit_buffer Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"

Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffuse_epollTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffepoll_backend Tff7b72= Tff7b72True

Tff7b72selfTff7b72.Td2a8ffpause_on_client_sleep Tff7b72= Tff7b72False

Tff7b72if Te6edf3connected_socket Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceives Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftarget_ip Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftarget_port Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72= Te6edf3connected_socket

Tff7b72if Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8fffamily Tff7b72== Te6edf3socketTff7b72.Td2a8ffAF_INETTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4, Te6edf3socketTff7b72.Td2a8ffTCP_NODELAYTb4b4b4, T79c0ff1Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instance Tff7b72= Tff7b72False

Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpause_on_client_sleep Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffpause_timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Tff7b72selfTff7b72.Td2a8ffCLIENT_SLEEP_PAUSE_TIMEOUT

Tff7b72elif Tff7b72selfTff7b72.Td2a8ffsocket_path Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceives Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftarget_ip Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftarget_port Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffconnectTb4b4b4(Tb4b4b4)

Tff7b72elif Te6edf3target_port Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceives Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftarget_ip Tff7b72= Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"
Tff7b72selfTff7b72.Td2a8fftarget_port Tff7b72= Te6edf3target_port
Tff7b72selfTff7b72.Td2a8ffconnectTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72= T79c0ff1_000_000_000
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffwriting Tff7b72= Tff7b72False

Tff7b72selfTff7b72.Td2a8ff_force_bitrate Tff7b72= Tff7b72False

Tff7b72selfTff7b72.Td2a8ffannounce_rate_target Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffannounce_rate_grace Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffannounce_rate_penalty Tff7b72= Tff7b72None

Tff7b72if Te6edf3connected_socket Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffepoll_backendTb4b4b4:
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffread_loopTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffshould_ingress_limitTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False

Tff7b72def Td2a8ffconnectTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsocket_path Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_UNIXTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_STREAMTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsocket_pathTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_INETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_STREAMTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_TCPTb4b4b4, Te6edf3socketTff7b72.Td2a8ffTCP_NODELAYTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffconnectTb4b4b4(Tb4b4b4(Tff7b72selfTff7b72.Td2a8fftarget_ipTb4b4b4, Tff7b72selfTff7b72.Td2a8fftarget_portTb4b4b4)Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instance Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffnever_connected Tff7b72= Tff7b72False

Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffphy_keepalive Tff7b72= Tff7b72True
Tff7b72if Tff7b72selfTff7b72.Td2a8ffepoll_backendTb4b4b4: Te6edf3BackboneInterfaceTff7b72.Td2a8ffadd_client_socketTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsocketTb4b4b4, Tff7b72selfTb4b4b4)

Tff7b72return Tff7b72True


Tff7b72def Td2a8ffreconnectTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffreconnectingTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreconnecting Tff7b72= Tff7b72True
Te6edf3attempts Tff7b72= T79c0ff0

Tff7b72while Tff7b72not Tff7b72selfTff7b72.Td2a8ffonlineTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LocalClientInterfaceTff7b72.Td2a8ffRECONNECT_WAITTb4b4b4)
Te6edf3attempts Tff7b72+Tff7b72= T79c0ff1

Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconnectTb4b4b4(Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffConnection attempt for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff failed: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffnever_connectedTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReconnected socket for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_INFOTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffreconnecting Tff7b72= Tff7b72False
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffepoll_backendTb4b4b4:
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffread_loopTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffjobTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LocalClientInterfaceTff7b72.Td2a8ffRECONNECT_WAITTff7b72+T79c0ff2Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffshared_connection_reappearedTb4b4b4(Tb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAttempt to reconnect on a non-initiator shared local interface. This should not happen.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72raise Tf85149IOErrorTb4b4b4(Ta5d6ff"Ta5d6ffAttempt to reconnect on a non-initiator local interfaceTa5d6ff"Tb4b4b4)


Tff7b72def Td2a8ffsend_keepaliveTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffonlineTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSending keepalive on Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) T8b949e# TODO: Remove
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffepoll_backendTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransmit_buffer Tff7b72+Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)Tff7b72+Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)
Te6edf3BackboneInterfaceTff7b72.Td2a8fftx_readyTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwriting Tff7b72= Tff7b72True
Te6edf3data Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)Tff7b72+Te6edf3HDLCTff7b72.Td2a8ffescapeTb4b4b4(Te6edf3dataTb4b4b4)Tff7b72+Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsendallTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwriting Tff7b72= Tff7b72False

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffException occurred while sending keepalive on Tffd700{Tff7b72selfTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72def Td2a8ffprocess_incomingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8ffrxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72tryTb4b4b4: Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffinboundTb4b4b4(Te6edf3dataTb4b4b4, Tff7b72selfTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAn error occurred in the processing of an incoming frame for Tffd700{Tff7b72selfTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)

Tff7b72def Td2a8ffprocess_outgoingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpause_on_client_sleep Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffpause_timeoutTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTX paused for LocalInterface client, dropping outbound packetTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4) T8b949e# TODO: Remove
Tff7b72return

Tff7b72if Tff7b72selfTff7b72.Td2a8ffonlineTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffepoll_backendTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransmit_buffer Tff7b72+Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)Tff7b72+Te6edf3HDLCTff7b72.Td2a8ffescapeTb4b4b4(Te6edf3dataTb4b4b4)Tff7b72+Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)
Te6edf3BackboneInterfaceTff7b72.Td2a8fftx_readyTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwriting Tff7b72= Tff7b72True

Tff7b72if Tff7b72selfTff7b72.Td2a8ff_force_bitrateTb4b4b4:
Tff7b72if Tff7b72not Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffsend_lockTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsend_lock Tff7b72= Te6edf3LockTb4b4b4(Tb4b4b4)

Tff7b72with Tff7b72selfTff7b72.Td2a8ffsend_lockTb4b4b4:
T8b949e# RNS.log(f"Simulating latency of {RNS.prettytime(s)} for {len(data)} bytes", RNS.LOG_EXTREME)
Te6edf3s Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72/ Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72* T79c0ff8
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3sTb4b4b4)

Te6edf3data Tff7b72= Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)Tff7b72+Te6edf3HDLCTff7b72.Td2a8ffescapeTb4b4b4(Te6edf3dataTb4b4b4)Tff7b72+Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffsendallTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwriting Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fftxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffparent_interfaceTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8fftxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffException occurred while transmitting via Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, tearing down interfaceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffhandle_hdlcTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3data_inTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffframe_buffer Tff7b72+Tff7b72= Te6edf3data_in
Te6edf3flags_remaining Tff7b72= Tff7b72True
Tff7b72while Te6edf3flags_remainingTb4b4b4:
Te6edf3frame_start Tff7b72= Tff7b72selfTff7b72.Td2a8ffframe_bufferTff7b72.Td2a8fffindTb4b4b4(Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4)
Tff7b72if Te6edf3frame_start Tff7b72!= Tff7b72-T79c0ff1Tb4b4b4:
Te6edf3frame_end Tff7b72= Tff7b72selfTff7b72.Td2a8ffframe_bufferTff7b72.Td2a8fffindTb4b4b4(Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4, Te6edf3frame_startTff7b72+T79c0ff1Tb4b4b4)
Tff7b72if Te6edf3frame_end Tff7b72!= Tff7b72-T79c0ff1Tb4b4b4:
Te6edf3frame Tff7b72= Tff7b72selfTff7b72.Td2a8ffframe_bufferTb4b4b4[Te6edf3frame_startTff7b72+T79c0ff1Tb4b4b4:Te6edf3frame_endTb4b4b4]
Te6edf3frame Tff7b72= Te6edf3frameTff7b72.Td2a8ffreplaceTb4b4b4(Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4, Te6edf3HDLCTff7b72.Td2a8ffFLAG Tff7b72^ Te6edf3HDLCTff7b72.Td2a8ffESC_MASKTb4b4b4]Tb4b4b4)Tb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffFLAGTb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3frame Tff7b72= Te6edf3frameTff7b72.Td2a8ffreplaceTb4b4b4(Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4, Te6edf3HDLCTff7b72.Td2a8ffESC Tff7b72^ Te6edf3HDLCTff7b72.Td2a8ffESC_MASKTb4b4b4]Tb4b4b4)Tb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3HDLCTff7b72.Td2a8ffESCTb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3frameTb4b4b4) Tff7b72> Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffHEADER_MINSIZETb4b4b4: Tff7b72selfTff7b72.Td2a8ffprocess_incomingTb4b4b4(Te6edf3frameTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffframe_buffer Tff7b72= Tff7b72selfTff7b72.Td2a8ffframe_bufferTb4b4b4[Te6edf3frame_endTb4b4b4:Tb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3flags_remaining Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4: Te6edf3flags_remaining Tff7b72= Tff7b72False

Tff7b72def Td2a8ffreceiveTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3data_inTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3data_inTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffhandle_hdlcTb4b4b4(Te6edf3data_inTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instance Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffdetachedTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSocket for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff was closed, attempting to reconnect...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffshared_connection_disappearedTb4b4b4(Tb4b4b4)
T8b949e# TODO: Potentially run this in a thread, but since if we get here,
T8b949e# there's no other connectivity left to block anyway, it might be
T8b949e# unnecessary.
Tff7b72selfTff7b72.Td2a8ffreconnectTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffteardownTb4b4b4(Te6edf3nowarningTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn interface error occurred, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTearing down Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffpause_on_client_sleepTb4b4b4: Tff7b72selfTff7b72.Td2a8ffpause_timeout Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Tff7b72selfTff7b72.Td2a8ffCLIENT_SLEEP_PAUSE_TIMEOUT

Tff7b72def Td2a8ffread_loopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffframe_buffer Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Te6edf3data_in Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6ff"
Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3data_in Tff7b72= Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffrecvTb4b4b4(T79c0ff4096Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3data_inTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffhandle_hdlcTb4b4b4(Te6edf3data_inTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instance Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffdetachedTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSocket for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff was closed, attempting to reconnect...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffshared_connection_disappearedTb4b4b4(Tb4b4b4)
T8b949e# TODO: Potentially run this in a thread, but since if we get here,
T8b949e# there's no other connectivity left to block anyway, it might be
T8b949e# unnecessary.
Tff7b72selfTff7b72.Td2a8ffreconnectTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffteardownTb4b4b4(Te6edf3nowarningTff7b72=Tff7b72TrueTb4b4b4)

Tff7b72break

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn interface error occurred, the contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTearing down Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffdetachTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsocketTb4b4b4, Ta5d6ff"Ta5d6ffcloseTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffcloseTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDetaching Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdetached Tff7b72= Tff7b72True
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffshutdownTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSHUT_RDWRTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while shutting down socket for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)

Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsocketTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while closing socket for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffsocket Tff7b72= Tff7b72None

Tff7b72def Td2a8ffteardownTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nowarningTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffOUT Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffIN Tff7b72= Tff7b72False

Tff7b72if Tff7b72self Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTff7b72.Td2a8ffremoveTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72if Tff7b72self Tff7b72in Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8fflocal_client_interfacesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8fflocal_client_interfacesTff7b72.Td2a8ffremoveTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffparent_interfaceTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8ffclients Tff7b72-Tff7b72= T79c0ff1
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffTransportTb4b4b4, Ta5d6ff"Ta5d6ffownerTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffowner Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3background Tff7b72= Tff7b72not Tff7b72selfTff7b72.Td2a8ffdetached
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffownerTff7b72.Td2a8ff_should_persist_dataTb4b4b4(Te6edf3backgroundTff7b72=Te6edf3backgroundTb4b4b4)

Tff7b72if Te6edf3nowarning Tff7b72== Tff7b72FalseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff experienced an unrecoverable error and is being torn down. Restart Reticulum to attempt to open this interface again.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffpanic_on_interface_errorTb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffis_connected_to_shared_instanceTb4b4b4:
Tff7b72if Te6edf3nowarning Tff7b72== Tff7b72FalseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPermanently lost connection to local shared RNS instance. Exiting now.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_CRITICALTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffexitTb4b4b4(Tb4b4b4)


Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsocket_pathTb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ffLocalInterface[Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsocket_pathTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff]Ta5d6ff"
Tff7b72elseTb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ffLocalInterface[Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8fftarget_portTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff]Ta5d6ff"


Tff7b72class T56d364LocalServerInterfaceTb4b4b4(Te6edf3InterfaceTb4b4b4)Tb4b4b4:
Te6edf3AUTOCONFIGURE_MTU Tff7b72= Tff7b72True

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4, Te6edf3bindportTff7b72=Tff7b72NoneTb4b4b4, Te6edf3socket_pathTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffepoll_backend Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffclients Tff7b72= T79c0ff0
Tff7b72if Te6edf3socket_path Tff7b72!= Tff7b72None Tff7b72and Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffget_instanceTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffuse_af_unixTb4b4b4: Tff7b72selfTff7b72.Td2a8ffsocket_path Tff7b72= Ta5d6fffTa5d6ff"Tffea00\0Ta5d6ffrns/Tffd700{Te6edf3socket_pathTffd700}Ta5d6ff"
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffsocket_path Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffIN Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffOUT Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Ta5d6ff"Ta5d6ffReticulumTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffmode Tff7b72= Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_FULL

Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffuse_epollTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffepoll_backend Tff7b72= Tff7b72True

Tff7b72if Te6edf3socket_path Tff7b72!= Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ffepoll_backendTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceives Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffbind_ip Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffbind_port Tff7b72= Tff7b72None

Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72selfTff7b72.Td2a8ffis_local_shared_instance Tff7b72= Tff7b72True
Te6edf3BackboneInterfaceTff7b72.Td2a8ffadd_listenerTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsocket_pathTb4b4b4, Te6edf3socket_typeTff7b72=Te6edf3socketTff7b72.Td2a8ffAF_UNIXTb4b4b4)

Tff7b72elif Te6edf3bindport Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceives Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffbind_ip Tff7b72= Ta5d6ff"Ta5d6ff127.0.0.1Ta5d6ff"
Tff7b72selfTff7b72.Td2a8ffbind_port Tff7b72= Te6edf3bindport

Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72selfTff7b72.Td2a8ffis_local_shared_instance Tff7b72= Tff7b72True

Te6edf3address Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffbind_ipTb4b4b4, Tff7b72selfTff7b72.Td2a8ffbind_portTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffepoll_backendTb4b4b4: Te6edf3BackboneInterfaceTff7b72.Td2a8ffadd_listenerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3addressTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72def Td2a8ffhandlerFactoryTb4b4b4(Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffcreateHandlerTb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3LocalInterfaceHandlerTb4b4b4(Te6edf3callbackTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)
Tff7b72return Te6edf3createHandler

Tff7b72selfTff7b72.Td2a8ffserver Tff7b72= Te6edf3ThreadingTCPServerTb4b4b4(Te6edf3addressTb4b4b4, Te6edf3handlerFactoryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffincoming_connectionTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffserverTff7b72.Td2a8ffdaemon_threads Tff7b72= Tff7b72True
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffserverTff7b72.Td2a8ffserve_foreverTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffannounce_rate_target Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffannounce_rate_grace Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffannounce_rate_penalty Tff7b72= Tff7b72None

Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72= T79c0ff1000Tff7b72*T79c0ff1000Tff7b72*T79c0ff1000
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True

Tff7b72def Td2a8ffincoming_connectionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3handlerTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffepoll_backendTb4b4b4:
Te6edf3client_socket Tff7b72= Te6edf3handler
Tff7b72if Te6edf3client_socketTff7b72.Td2a8fffamily Tff7b72== Te6edf3socketTff7b72.Td2a8ffAF_INETTb4b4b4:
Te6edf3interface_name Tff7b72= Tffa657strTb4b4b4(Tffa657strTb4b4b4(Te6edf3client_socketTff7b72.Td2a8ffgetpeernameTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72elif Te6edf3client_socketTff7b72.Td2a8fffamily Tff7b72== Te6edf3socketTff7b72.Td2a8ffAF_UNIXTb4b4b4:
Te6edf3interface_name Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffclientsTffd700}Ta5d6ff@Tffd700{Tff7b72selfTff7b72.Td2a8ffsocket_pathTffd700}Ta5d6ff"

Te6edf3spawned_interface Tff7b72= Te6edf3LocalClientInterfaceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffownerTb4b4b4, Te6edf3nameTff7b72=Te6edf3interface_nameTb4b4b4, Te6edf3connected_socketTff7b72=Te6edf3client_socketTb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffOUT Tff7b72= Tff7b72selfTff7b72.Td2a8ffOUT
Te6edf3spawned_interfaceTff7b72.Td2a8ffIN Tff7b72= Tff7b72selfTff7b72.Td2a8ffIN
Te6edf3spawned_interfaceTff7b72.Td2a8ffsocket Tff7b72= Te6edf3client_socket
Te6edf3spawned_interfaceTff7b72.Td2a8ffparent_interface Tff7b72= Tff7b72self
Te6edf3spawned_interfaceTff7b72.Td2a8ffbitrate Tff7b72= Tff7b72selfTff7b72.Td2a8ffbitrate

Tff7b72if Te6edf3client_socketTff7b72.Td2a8fffamily Tff7b72== Te6edf3socketTff7b72.Td2a8ffAF_INETTb4b4b4:
Te6edf3spawned_interfaceTff7b72.Td2a8fftarget_ip Tff7b72= Te6edf3client_socketTff7b72.Td2a8ffgetpeernameTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3spawned_interfaceTff7b72.Td2a8fftarget_port Tff7b72= Tffa657strTb4b4b4(Te6edf3client_socketTff7b72.Td2a8ffgetpeernameTb4b4b4(Tb4b4b4)Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)

Tff7b72elif Te6edf3client_socketTff7b72.Td2a8fffamily Tff7b72== Te6edf3socketTff7b72.Td2a8ffAF_UNIXTb4b4b4:
Te6edf3spawned_interfaceTff7b72.Td2a8fftarget_ip Tff7b72= Tff7b72None
Te6edf3spawned_interfaceTff7b72.Td2a8fftarget_port Tff7b72= Te6edf3interface_name
Te6edf3spawned_interfaceTff7b72.Td2a8ffsocket_path Tff7b72= Tff7b72selfTff7b72.Td2a8ffsocket_path

Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ff_force_bitrateTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3spawned_interfaceTff7b72.Td2a8ff_force_bitrate Tff7b72= Tff7b72selfTff7b72.Td2a8ff_force_bitrate
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3spawned_interfaceTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8fflocal_client_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3spawned_interfaceTb4b4b4)
Te6edf3BackboneInterfaceTff7b72.Td2a8ffadd_client_socketTb4b4b4(Te6edf3client_socketTb4b4b4, Te6edf3spawned_interfaceTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffclients Tff7b72+Tff7b72= T79c0ff1
Tff7b72return Tff7b72True

Tff7b72elseTb4b4b4:
Te6edf3interface_name Tff7b72= Tffa657strTb4b4b4(Tffa657strTb4b4b4(Te6edf3handlerTff7b72.Td2a8ffclient_addressTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3spawned_interface Tff7b72= Te6edf3LocalClientInterfaceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffownerTb4b4b4, Te6edf3nameTff7b72=Te6edf3interface_nameTb4b4b4, Te6edf3connected_socketTff7b72=Te6edf3handlerTff7b72.Td2a8ffrequestTb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffOUT Tff7b72= Tff7b72selfTff7b72.Td2a8ffOUT
Te6edf3spawned_interfaceTff7b72.Td2a8ffIN Tff7b72= Tff7b72selfTff7b72.Td2a8ffIN
Te6edf3spawned_interfaceTff7b72.Td2a8fftarget_ip Tff7b72= Te6edf3handlerTff7b72.Td2a8ffclient_addressTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3spawned_interfaceTff7b72.Td2a8fftarget_port Tff7b72= Tffa657strTb4b4b4(Te6edf3handlerTff7b72.Td2a8ffclient_addressTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Te6edf3spawned_interfaceTff7b72.Td2a8ffparent_interface Tff7b72= Tff7b72self
Te6edf3spawned_interfaceTff7b72.Td2a8ffbitrate Tff7b72= Tff7b72selfTff7b72.Td2a8ffbitrate
Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ff_force_bitrateTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3spawned_interfaceTff7b72.Td2a8ff_force_bitrate Tff7b72= Tff7b72selfTff7b72.Td2a8ff_force_bitrate
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffinterfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3spawned_interfaceTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8fflocal_client_interfacesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3spawned_interfaceTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffclients Tff7b72+Tff7b72= T79c0ff1
Te6edf3spawned_interfaceTff7b72.Td2a8ffread_loopTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffprocess_outgoingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72pass

Tff7b72def Td2a8ffreceived_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_spawnedTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3from_spawnedTb4b4b4: Tff7b72selfTff7b72.Td2a8ffia_freq_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffsent_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3from_spawnedTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3from_spawnedTb4b4b4: Tff7b72selfTff7b72.Td2a8ffoa_freq_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)

Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsocket_pathTb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ffShared Instance[Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsocket_pathTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffea00\0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff]Ta5d6ff"
Tff7b72elseTb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ffShared Instance[Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffbind_portTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff]Ta5d6ff"

Tff7b72class T56d364LocalInterfaceHandlerTb4b4b4(Te6edf3socketserverTff7b72.Td2a8ffBaseRequestHandlerTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72= Te6edf3callback
Te6edf3socketserverTff7b72.Td2a8ffBaseRequestHandlerTff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)

Tff7b72def Td2a8ffhandleTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4(Te6edf3handlerTff7b72=Tff7b72selfTb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────